;
;  PROGRAM:  RECORD
;  AUTHOR:  RICHARD CONN
;  VERSION:  1.4
;  DATE:  6 Jan 83
;  PREVIOUS VERSIONS:  1.3 (5 Jan 83)
;  PREVIOUS VERSIONS:  1.0 (30 Dec 82), 1.1 (31 Dec 82), 1.2 (1 Jan 83)
;
VERS	EQU	14

;
;	This program is Copyright (c) 1982, 1983 by Richard Conn
;	All Rights Reserved
;
;	ZCPR2 and its utilities, including this one, are released
; to the public domain.  Anyone who wishes to USE them may do so with
; no strings attached.  The author assumes no responsibility or
; liability for the use of ZCPR2 and its utilities.
;
;	The author, Richard Conn, has sole rights to this program.
; ZCPR2 and its utilities may not be sold without the express,
; written permission of the author.
;


;
;	RECORD enables and disables the disk output redirectable I/O
; drivers for ZCPR2.  This command takes two forms:
;
;		RECORD ON	<-- Turn on console recording
;		RECORD OFF	<-- Turn off console recording
;		RECORD ON LST	<-- Turn on printer recording
;		RECORD OFF LST	<-- Turn off printer recording
;
	ext	print,fname,bbline

fcb	equ	5dh		;FCB Input
fcb2	equ	6dh		;FCB2 Input
cr	equ	0dh
lf	equ	0ah

;
;  Branch to Start of Program
;
	jmp	start

;
;******************************************************************
;
;  SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format
;
;	This data block precisely defines the data format for
; initial features of a ZCPR2 system which are required for proper
; initialization of the ZCPR2-Specific Routines in SYSLIB.
;

;
;  EXTERNAL PATH DATA
;
EPAVAIL:
	DB	0FFH	; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES)
EPADR:
	DW	40H	; ADDRESS OF EXTERNAL PATH IF AVAILABLE

;
;  INTERNAL PATH DATA
;
INTPATH:
	DB	0,0	; DISK, USER FOR FIRST PATH ELEMENT
			; DISK = 1 FOR A, '$' FOR CURRENT
			; USER = NUMBER, '$' FOR CURRENT
	DB	0,0
	DB	0,0
	DB	0,0
	DB	0,0
	DB	0,0
	DB	0,0
	DB	0,0	; DISK, USER FOR 8TH PATH ELEMENT
	DB	0	; END OF PATH

;
;  MULTIPLE COMMAND LINE BUFFER DATA
;
MCAVAIL:
	DB	0FFH	; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE?
MCADR:
	DW	0FF00H	; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE

;
;  DISK/USER LIMITS
;
MDISK:
	DB	4	; MAXIMUM NUMBER OF DISKS
MUSER:
	DB	31	; MAXIMUM USER NUMBER

;
;  FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK
;
DOK:
	DB	0FFH	; ALLOW DISK CHANGE? (0=NO, 0FFH=YES)
UOK:
	DB	0FFH	; ALLOW USER CHANGE? (0=NO, 0FFH=YES)

;
;  PRIVILEGED USER DATA
;
PUSER:
	DB	10	; BEGINNING OF PRIVILEGED USER AREAS
PPASS:
	DB	'chdir',0	; PASSWORD FOR MOVING INTO PRIV USER AREAS
	DS	41-($-PPASS)	; 40 CHARS MAX IN BUFFER + 1 for ending NULL

;
;  CURRENT USER/DISK INDICATOR
;
CINDIC:
	DB	'$'	; USUAL VALUE (FOR PATH EXPRESSIONS)

;
;  DMA ADDRESS FOR DISK TRANSFERS
;
DMADR:
	DW	80H	; TBUFF AREA

;
;  NAMED DIRECTORY INFORMATION
;
NDRADR:
	DW	00000H	; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY
NDNAMES:
	DB	64	; MAX NUMBER OF DIRECTORY NAMES
DNFILE:
	DB	'NAMES   '	; NAME OF DISK NAME FILE
	DB	'DIR'		; TYPE OF DISK NAME FILE

;
;  REQUIREMENTS FLAGS
;
EPREQD:
	DB	000H	; EXTERNAL PATH?
MCREQD:
	DB	000H	; MULTIPLE COMMAND LINE?
MXREQD:
	DB	000H	; MAX USER/DISK?
UDREQD:
	DB	000H	; ALLOW USER/DISK CHANGE?
PUREQD:
	DB	000H	; PRIVILEGED USER?
CDREQD:
	DB	000H	; CURRENT INDIC AND DMA?
NDREQD:
	DB	000H	; NAMED DIRECTORIES?
Z2CLASS:
	DB	1	; CLASS 1
	DB	'ZCPR2'
	DS	10	; RESERVED

;
;  END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA
;
;******************************************************************
;
iobase:
	dw	0	; I/O Driver Base Address

;
;  Start of Program
;
start:
	call	print
	db	'RECORD, Version '
	db	(vers/10)+'0','.',(vers mod 10)+'0',0

	lhld	iobase		;Check for I/O Driver Defn
	mov	a,h
	ora	l
	jnz	start0
	call	print
	db	cr,lf,'Abort -- I/O Driver Address NOT Defined',0
	ret

start0:
	call	status		;Call Status Routine
	jz	nodriver	;No Driver Available?
	cpi	80H		;MUST have Disk Driver Module (> 80H) Loaded
	jnc	start1
	call	print
	db	cr,lf,'Abort -- Disk Driver Module NOT Loaded',0
	ret
nodriver:
	call	print
	db	cr,lf,'Abort -- No I/O Driver Module Loaded',0
	ret

start1:
	lda	fcb		;Get first char
	cpi	'O'		;Must be O
	jnz	help
	lda	fcb+1		;Get 2nd char
	cpi	'N'		;ON?
	jnz	off
on:
	call	getfile	;Get File Name
	lda	fcb2	;Printer?
	cpi	'P'
	jnz	on1
	call	lopen	;TTY (HL pts to File FCB)
	call	print
	db	cr,lf,'++ TTY Recording ON ++',0
	ret
on1:
	call	copen	;CRT (HL pts to File FCB)
	call	print
	db	cr,lf,'++ CRT Recording ON ++',0
	ret
off:
	lda	fcb2	;Printer?
	cpi	'P'
	jnz	off1
	call	print
	db	cr,lf,'++ TTY Recording OFF ++',cr,lf,0
	call	lclose	;Close Disk File
	ret
off1:
	call	print
	db	cr,lf,'++ CRT Recording OFF ++',cr,lf,0
	call	cclose	;Close Disk File
	ret
;
;  Print Help Message
;
help:
	call	print
	db	cr,lf
	db	cr,lf,'RECORD turns on and off recording of screen displays'
	db	cr,lf,'on disk under ZCPR2 with the SYSIO Redirectable I/O '
	db	'Drivers'
	db	cr,lf,'engaged.'
	db	cr,lf
	db	cr,lf,'It is invoked by two forms:'
	db	cr,lf
	db	cr,lf,'	RECORD ON  or RECORD ON PRINTER'
	db	cr,lf,'	RECORD OFF or RECORD OFF PRINTER'
	db	cr,lf
	db	cr,lf,'Minimum Required Option Forms are ON, OF, and P:'
	db	cr,lf,'	RECORD ON P = RECORD ON PRINTER'
	db	cr,lf,'If the P option is given, then TTY output is '
	db	'recorded,'
	db	cr,lf,'else CRT output is recorded.'
	db	cr,lf,0
	ret
;
;  Obtain Name of Output File and Return Pointer to its FCB in HL
;
getfile:
	call	print
	db	cr,lf,'Output File Name (<CR> for DISKOUT)? ',0
	mvi	a,0ffh	;Caps
	call	bbline	;Get user Input
	call	sblank	;Skip to Non-Blank
	ora	a	;EOL?
	jz	defexit	;Done if Default
	lxi	d,confcb	;Pt to FCB
	push	d	;Save ptr for return
	call	fname	;Extract Name
	jz	uderr	;No UD Allowed
	mov	a,c	;Check for any UD
	cpi	0ffh
	jnz	uderr
	mov	a,b
	cpi	0ffh
	jz	getf1
uderr:
	call	print
	db	cr,lf,'Override -- File is Placed in your Current Directory'
	db	cr,lf,0
getf1:
	pop	h	;Get ptr to FCB
	ret
defexit:
	lxi	h,confcb	;Default FCB
	lda	fcb2	;Check for Printer
	cpi	'P'
	rnz
	lxi	h,prtfcb	;Printer FCB
	ret
;
;  Skip to Non-Blank
;
sblank:
	mov	a,m	;Get char
	inx	h	;Pt to next
	cpi	' '	;Loop if Space
	jz	sblank
	dcx	h	;Pt to Non-Blank Char
	ret

;
;  I/O Driver Interface Routines
;
status:
	push	h		;Save HL
	push	d		;Save DE
	lxi	d,0		;No Offset for Status
runio:
	lhld	iobase		;Get I/O Base Address
	dad	d		;Pt to Routine
	pop	d		;Restore DE
	xthl			;Restore HL and Place Address on Stack
	ret			;"Run" Routine
copen:
	push	h		;Save Regs
	push	d
	lxi	d,36		;Offset for Console Open Routine
	jmp	runio		;Run Routine
cclose:
	push	h		;Save Regs
	push	d
	lxi	d,39		;Offset for Console Close Routine
	jmp	runio
lopen:
	push	h		;Save Regs
	push	d
	lxi	d,42		;Offset for Printer Open Routine
	jmp	runio
lclose:
	push	h		;Save Regs
	push	d
	lxi	d,45		;Offset for Printer Close Routine
	jmp	runio

;
;  FCBs
;
confcb:
	db	0
	db	'DISKOUT '
	db	'CON'
	ds	24
prtfcb:
	db	0
	db	'DISKOUT '
	db	'PRT'
	ds	24

	end
